﻿namespace Core.Library
{
    public struct StatusStruct
    {
        public int Status { get; set; }
        public int Priority { get; set; }
        public string StatusName { get; set; }
    }

    public class StatusHelper
    {
        public const int IsDraft                = 1;
        public const int IsWaitingForPublish    = 2;
        public const int IsReturned             = 4;
        public const int IsPublished            = 8;
        public const int IsRemoved              = 16;
        public const int IsDeleted              = 32;
        public const int IsUnLocked             = 64;

        public const int IsHighlightCategory    = 128;
        public const int IsHighlightHomePage    = 256;

        public static readonly int[] ListStatus = new int[] { 1, 2, 4, 8, 16, 32, 64 };
        public static readonly int[] AllListStatus = new int[] { 1, 2, 4, 8, 16, 32, 64, 128, 256 };      

        public static int RemoveHighlightStatus(int currentHighlight)
        {
            if (IsChecked(currentHighlight, IsHighlightHomePage))
                currentHighlight = UnCheck(currentHighlight, IsHighlightHomePage);

            if (IsChecked(currentHighlight, IsHighlightCategory))
                currentHighlight = UnCheck(currentHighlight, IsHighlightCategory);

            return currentHighlight;
        }      

        public static int RemoveStatus(int currentStatus, int targetStatus)
        {
            // Xóa trạng thái của bài viết & Không xóa trạng thái nổi bật chuyên mục và trang chủ
            for (var i = 0; i < ListStatus.Length; i++)
            {
                var s = ListStatus[i];
                if ((currentStatus & s) == s)
                    currentStatus -= s;
            }

            // Cập nhật trạng thái mới cho bài viết
            currentStatus = currentStatus + targetStatus;
            return currentStatus;
        }

        /// <summary>
        /// kiểm tra xem với trạng thái hiện tại currentStatus thì trạng thái checkStatus có được check hay ko
        /// vd: 
        /// currentStatus = 1 + 2 + 4 + 8 = 15 --> bit:1111 
        /// checkStatus = 8 --> bit 1000
        /// trả lại true
        /// </summary>
        /// <param name="targetStatus">có thể là 1 trạng thái (0001 / 0010 / 0100 / 1000) hay nhiều trạng thái (1111)</param>
        /// <param name="currentStatus"></param>
        /// <returns></returns>
        public static bool IsChecked(int currentStatus, int targetStatus)
        {
            var temp = targetStatus & currentStatus;
            return temp == targetStatus;
        }

        /// <summary>
        /// trả lại trạng thái đã bỏ targetStatus
        /// vd:
        /// currentStatus = 1 + 2 + 4 + 8 = 15 --> bit:1111 
        /// targetStatus = 4 --> bit:0100
        /// trả lại: 11 --> bit:1011
        /// </summary>
        /// <param name="targetStatus"></param>
        /// <param name="currentStatus"></param>
        /// <returns></returns>
        public static int UnCheck(int currentStatus, int targetStatus)
        {
            if (IsChecked(currentStatus, targetStatus))
                return currentStatus - targetStatus;
            return currentStatus;
        }

        /// <summary>
        /// trả lại trạng thái đã thêm checkStatus
        /// vd:
        /// currentStatus = 1 + 2 + 8 = 11 --> bit:1011 
        /// checkStatus = 4 --> bit:0100
        /// trả lại: 15 --> bit:1111
        /// </summary>
        /// <param name="targetStatus"></param>
        /// <param name="currentStatus"></param>
        /// <returns></returns>
        public static int Check(int currentStatus, int targetStatus)
        {
            if (!IsChecked(currentStatus, targetStatus))
                return currentStatus + targetStatus;
            return currentStatus;
        }                
    }
}
